﻿using System;
using System.Windows.Media;

namespace Levfier.GUI.EditorControls.Parameters
{
    /// <summary>
    /// SpinBoxControl.xaml の相互作用ロジック
    /// </summary>
    [Serializable]
    public partial class SpinBoxControl : ParameterControl
    {
        /// <summary>
        /// コントロールの名前
        /// </summary>
        public static readonly string ControlName = "SpinBox";

        /// <summary>
        /// 現在の値
        /// </summary>
        //public override double Value
        //{
        //    get
        //    {
        //        return this.spinBox.Value;
        //    }
        //    set
        //    {
        //        if (value > this.MaxValue)
        //        {
        //            this.spinBox.Value = this.MaxValue;
        //        }
        //        else if (value < this.MinValue)
        //        {
        //            this.spinBox.Value = this.MinValue;
        //        }
        //        else
        //        {
        //            this.spinBox.Value = value;
        //        }
        //    }
        //}

        /// <summary>
        /// 設定できる値の最大値
        /// </summary>
        public override double MaxValue
        {
            get
            {
                return this.spinBox.MaxValue;
            }
            set
            {
                if (value > this.TargetParameter.MaxValue)
                {
                    this.spinBox.MaxValue = this.TargetParameter.MaxValue;
                }
                else if (value < this.MinValue)
                {
                    this.spinBox.MaxValue = this.MinValue;
                }
                else
                {
                    this.spinBox.MaxValue = value;
                }
            }
        }

        /// <summary>
        /// 設定できる値の最小値
        /// </summary>
        public override double MinValue
        {
            get
            {
                return this.spinBox.MinValue;
            }
            set
            {
                if (value > this.MaxValue)
                {
                    this.spinBox.MinValue = this.MaxValue;
                }
                else if (value < this.TargetParameter.MinValue)
                {
                    this.spinBox.MinValue = this.TargetParameter.MinValue;
                }
                else
                {
                    this.spinBox.MinValue = value;
                }
            }
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public SpinBoxControl()
        {
            InitializeComponent();
        }

        /// <summary>
        /// スピンボックスの内容が変更された際の動作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void spinBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            if (null != this.TargetParameter)
            {
                double value = this.spinBox.Value;
                this.TargetParameter.Value = value;
            }
        }

        /// <summary>
        /// 選択された時の動作
        /// 末端の子クラスで実装すること
        /// </summary>
        /// <param name="sender">イベント発生源</param>
        public override void Select(object sender)
        {
            this.border.BorderBrush = this.selectedBrush;
        }

        /// <summary>
        /// 選択解除された時の動作
        /// 末端の子クラスで実装すること
        /// </summary>
        /// <param name="sender">イベント発生源</param>
        public override void Unselect(object sender)
        {
            this.border.BorderBrush = Brushes.Transparent;
        }
    }
}
